// 导入axios实例
import axios, {interceptors} from 'axios';

// 导入一些常量
import {MC_MANAGE_HOST} from '@/const';

/* =============== Axios实例配置 =============== */
// 创建Axios实例: 配置请求前缀和超时时间
export const MC_MANAGE_AXIOS = axios.create({
    baseURL: `${MC_MANAGE_HOST}/api/v1`,
    timeout: 5000
});
    /* =============== 请求拦截器 =============== */

// 在发送请求前执行
    MC_MANAGE_AXIOS.interceptors.request.use(
        // 正常时执行该函数，req为当前请求对象
        req => {
            // 统一打印请求数据，便于测试，生产时删除
            console.log('拦截到请求: ', req);
            // 从sessionStorage中获取Token令牌
            let token = sessionStorage.getItem("token");
            // 若Token令牌存在，则将Token令牌存入请求头
            if (token) req.headers['token'] = token;
            // 无论Token是否获取成功，都放行请求
            return req;
        },
        // 异常时执行该函数，e为异常对象: 异常时阻止该响应并展示异常信息
        err => Promise.reject(err)
    );

// 在接收到响应之后执行
    MC_MANAGE_AXIOS.interceptors.response.use(
        // 正常时执行该函数，resp为当前请求对象
        resp => {
            // 统一打印响应数据，便于测试，生产时删除
            console.log('拦截到响应: ', resp);
            // 若不需要Token续期，则直接放行请求
            return resp;
        },
        // 异常时执行该函数，e为异常对象: 异常时阻止该响应并展示异常信息
        err => Promise.reject(err)
    );


    /* =============== 拦截器 =============== */

// 在发送请求前执行
    MC_MANAGE_AXIOS.interceptors.request.use(
        // 正常时执行该函数，req为当前请求对象
        req => {
            // 统一打印请求数据，便于测试，生产时删除
            console.log('拦截到请求: ', req);
            // 从sessionStorage中获取Token令牌
            let token = sessionStorage.getItem("token");
            // 若Token令牌存在，则将Token令牌存入请求头
            if (token) req.headers['token'] = token;
            // 无论Token是否获取成功，都放行请求
            return req;
        },
        // 异常时执行该函数，e为异常对象: 异常时阻止该响应并展示异常信息
        err => Promise.reject(err)
    );

// 在接收到响应之后执行
    MC_MANAGE_AXIOS.interceptors.response.use(
        // 正常时执行该函数，req为当前请求对象
        resp => {
            // 统一打印响应数据，便于测试，生产时删除
            console.log('拦截到响应: ', resp);

            // 判断需要对Token进行续期: 约定Token即将过期时后台会返回一个 `code=1002` 的响应
            if (resp.data.code === 1002) {
                console.log(" >> Token自动续期-开始，原Token: {}", sessionStorage.getItem("token"));
                // 从响应中获取新的Token令牌
                let newToken = resp.data.data;
                // 更新sessionStorage中的Token令牌
                sessionStorage.setItem("token", newToken);
                // 将新的Token令牌设置到请求头
                MC_MANAGE_AXIOS.defaults.headers['token'] = newToken;
                console.log(" >> Token自动续期-结束，新Token: {}", newToken);
                // 携带新Token重新发送请求
                return MC_MANAGE_AXIOS.request(resp.config);
            }
            // 若不需要Token续期，则直接放行请求
            return resp;
        },
        // 异常时执行该函数，e为异常对象: 异常时阻止该响应并展示异常信息
        err => Promise.reject(err)
    );